#pragma once
#include "DQuaternion.h"
#include "DVector3.h"
#include "DVector4.h"
#include "DMatrix3.h"

namespace Skill
{
	namespace Ode
	{
		void DQuaternion::CollectManagedMemory()
		{
		}

		VALUE_PROP_DEFINITION_GETSET(DQuaternion,_This[0],dReal,X);
		VALUE_PROP_DEFINITION_GETSET(DQuaternion,_This[1],dReal,Y);
		VALUE_PROP_DEFINITION_GETSET(DQuaternion,_This[2],dReal,Z);
		VALUE_PROP_DEFINITION_GETSET(DQuaternion,_This[3],dReal,W);


		DQuaternion^ DQuaternion::Identity::get()
		{
			DQuaternion^ q = gcnew DQuaternion();
			q->SetIdentity();
			return q;
		}
		void DQuaternion::SetIdentity()
		{
			dQSetIdentity(_This);
		}

		void DQuaternion::SetFromAxisAndAngle(dReal ax, dReal ay, dReal az, dReal angle)
		{
			dQFromAxisAndAngle(_This,ax, ay, az, angle);
		}
		void DQuaternion::SetFromAxisAndAngle(DVector3^ a, dReal angle)
		{
			dQFromAxisAndAngle(_This,a->X, a->Y, a->Z, angle);
		}
		void DQuaternion::SetFromAxisAndAngle(DVector4^ a, dReal angle)
		{
			dQFromAxisAndAngle(_This,a->X, a->Y, a->Z, angle);
		}

		DQuaternion^ DQuaternion::FromAxisAndAngle(dReal ax, dReal ay, dReal az, dReal angle)
		{
			DQuaternion^ q = gcnew DQuaternion();
			q->SetFromAxisAndAngle(ax, ay, az, angle);
			return q;
		}
		DQuaternion^ DQuaternion::FromAxisAndAngle(DVector3^ a, dReal angle)
		{
			DQuaternion^ q = gcnew DQuaternion();
			q->SetFromAxisAndAngle(a->X, a->Y, a->Z, angle);
			return q;
		}
		DQuaternion^ DQuaternion::FromAxisAndAngle(DVector4^ a, dReal angle)
		{
			DQuaternion^ q = gcnew DQuaternion();
			q->SetFromAxisAndAngle(a->X, a->Y, a->Z, angle);
			return q;
		}

		void DQuaternion::Multiply0(DQuaternion^ qb, DQuaternion^ qc)
		{
			dQMultiply0(_This,qb->_This,qc->_This);
		}
		void DQuaternion::Multiply1(DQuaternion^ qb, DQuaternion^ qc)
		{
			dQMultiply1(_This,qb->_This,qc->_This);
		}
		void DQuaternion::Multiply2(DQuaternion^ qb, DQuaternion^ qc)
		{
			dQMultiply2(_This,qb->_This,qc->_This);
		}
		void DQuaternion::Multiply3(DQuaternion^ qb, DQuaternion^ qc)
		{
			dQMultiply3(_This,qb->_This,qc->_This);
		}

		void DQuaternion::SetFromRotation(DMatrix3^ r)
		{
			dQfromR(_This,r->_This);
		}

		DQuaternion^ DQuaternion::FromRotation(DMatrix3^ r)
		{
			DQuaternion^ q = gcnew DQuaternion();
			dQfromR(q->_This,r->_This);
			return q;
		}

		void DQuaternion::SetDQfromW(DVector3^ w, DQuaternion^ q)
		{
			dDQfromW(_This, w->_This,q->_This);
		}
		DQuaternion^ DQuaternion::DQfromW(DVector3^ w, DQuaternion^ q)
		{
			DQuaternion^ result = gcnew DQuaternion();
			dDQfromW(result->_This, w->_This,q->_This);
			return result;
		}
	}
}